package com.simon.webflux.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;

@Configuration
// @EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/api/**")
                .allowedOrigins("https://domain2.com")
                .allowedMethods("PUT", "DELETE")
                .allowedHeaders("header1", "header2", "header3")
                .exposedHeaders("header1", "header2")
                .allowCredentials(true).maxAge(3600);

        // Add more mappings...
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // ...
    }

    // 默认情况下，安装了各种数字和日期类型的格式化程序，
    // 并支持通过字段@NumberFormat和@DateTimeFormat字段进行自定义。

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().maxInMemorySize(512 * 1024);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 重新映射路径
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .resourceChain(false);

        registry.addResourceHandler("/swagger-ui.html**")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/")
                .resourceChain(true);
        // 在下一个示例中，给定以 开头的请求，
        // /resources相对路径用于查找和提供相对于/static类路径上的静态资源。
        // 资源的服务期限为一年，以确保最大限度地使用浏览器缓存并减少浏览器发出的 HTTP 请求。
        // Last-Modified还评估标头，如果存在，则304返回状态代码。以下列表显示了示例：
        // registry.addResourceHandler("/resources/**")
        //         .addResourceLocations("/public", "classpath:/static/")
        //         .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
    }
}